﻿(function($) {
    $.fn.hoverIntent = function(f, g) {
        var cfg = { sensitivity: 7, interval: 100, timeout: 0 };
        cfg = $.extend(cfg, g ? { over: f, out: g} : f); var cX, cY, pX, pY;
        var track = function(ev) { cX = ev.pageX; cY = ev.pageY }; var compare = function(ev, ob) {
            ob.hoverIntent_t = clearTimeout(ob.hoverIntent_t);
            if ((Math.abs(pX - cX) + Math.abs(pY - cY)) < cfg.sensitivity) {
                $(ob).unbind("mousemove", track);
                ob.hoverIntent_s = 1; return cfg.over.apply(ob, [ev])
            } else {
                pX = cX;
                pY = cY; ob.hoverIntent_t = setTimeout(function() {
                    compare(ev, ob)
                }, cfg.interval)
            }
        }; var delay = function(ev, ob) {
            ob.hoverIntent_t = clearTimeout(ob.hoverIntent_t);
            ob.hoverIntent_s = 0; return cfg.out.apply(ob, [ev])
        }; var handleHover = function(e) {
            var p = (e.type == "mouseover" ? e.fromElement : e.toElement) || e.relatedTarget;
            while (p && p != this) {
                try { p = p.parentNode } catch (e) {
                    p = this
                }
            } if (p == this) { return false } var ev = jQuery.extend({}, e);
            var ob = this; if (ob.hoverIntent_t) {
                ob.hoverIntent_t = clearTimeout(ob.hoverIntent_t)
            } if (e.type == "mouseover") {
                pX = ev.pageX; pY = ev.pageY; $(ob).bind("mousemove", track);
                if (ob.hoverIntent_s != 1) {
                    ob.hoverIntent_t = setTimeout(function() {
                        compare(ev, ob)
                    }, cfg.interval)
                }
            } else {
                $(ob).unbind("mousemove", track);
                if (ob.hoverIntent_s == 1) {
                    ob.hoverIntent_t = setTimeout(function() {
                        delay(ev, ob)
                    }, cfg.timeout)
                }
            }
        }; return this.mouseover(handleHover).mouseout(handleHover)
    }
})(jQuery);